home *** CD-ROM | disk | FTP | other *** search
/ Aminet 6 / Aminet 6 - June 1995.iso / Aminet / misc / amag / AM95047.lha / p4 / src.lha / src / IA.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-06-27  |  14.6 KB  |  860 lines

  1. /*
  2.  *    Moteur de reflexion v1.0
  3.  *
  4.  *    12-Mar-94
  5.  *
  6. */
  7.  
  8. #include "protos.h"
  9. #include "main.h"
  10.  
  11. #include <stdio.h>
  12.  
  13. #define QUATRE 31000
  14. #define BTROISTROIS 6000
  15. #define BTROISBTROIS 10000
  16. #define BTROIS 5000        /* on peut atteindre de suite pour JOU */
  17. #define TROISTROIS 2000
  18. #define TROIS 1000        /* on peut atteindre de suite pour ORD */
  19. #define RGAIN 10000
  20. #define GAIN 30000
  21. #define DEUXDEUX 200
  22. #define DEUX 100
  23.  
  24. UBYTE CoupX[10];
  25. extern UBYTE prof_max;
  26. ptrtab terrain;
  27. ULONG Positions;
  28. UBYTE lignes[]={0,10,50,70,50,10,0};
  29.  
  30. UBYTE TestTab(ptrtab pipo,char flag)
  31. {
  32.  UBYTE i,j,k,i1,j1,i2,j2;
  33.  
  34.  i2=(XMAX+GAGNE+3)>>1;
  35.  j2=(YMAX+GAGNE+2)>>1;
  36.  
  37.  for(j=GAGNE;j<pipo->colonnes[i2];j++)
  38.  {
  39.   if(pipo->jeu[i2][j]==flag)
  40.   {
  41.    k=1;                        /* Diagonal Haut */
  42.    i1=i2+1;
  43.    j1=j+1;
  44.    while(pipo->jeu[i1][j1]==flag)
  45.    {
  46.     k++;
  47.     i1++;
  48.     j1++;
  49.    }
  50.    i1=i2-1;
  51.    j1=j-1;
  52.    while(pipo->jeu[i1][j1]==flag)
  53.    {
  54.     k++;
  55.     i1--;
  56.     j1--;
  57.    }
  58.    if(k>3)
  59.     return(2);
  60.    k=1;                        /* Diagonal Bas */
  61.    i1=i2+1;
  62.    j1=j-1;
  63.    while(pipo->jeu[i1][j1]==flag)
  64.    {
  65.     k++;
  66.     i1++;
  67.     j1--;
  68.    }
  69.    i1=i2-1;
  70.    j1=j+1;
  71.    while(pipo->jeu[i1][j1]==flag)
  72.    {
  73.     k++;
  74.     i1--;
  75.     j1++;
  76.    }
  77.    if(k>3)
  78.     return(3);
  79.    k=1;                        /* Horizontal */
  80.    i1=i2+1;
  81.    while(pipo->jeu[i1][j]==flag)
  82.    {
  83.     k++;
  84.     i1++;
  85.    }
  86.    i1=i2-1;
  87.    while(pipo->jeu[i1][j]==flag)
  88.    {
  89.     k++;
  90.     i1--;
  91.    }
  92.    if(k>3)
  93.     return(1);
  94.   }
  95.  }
  96.  for(i=GAGNE;i<GAGNE+XMAX;i++)
  97.  {
  98.   k=0;                         /* Vertical */
  99.   j1=j2;
  100.   while(pipo->jeu[i][j1]==flag)
  101.   {
  102.    k++;
  103.    j1++;
  104.   }
  105.   if(k)
  106.   {
  107.    j1=j2-1;
  108.    while(pipo->jeu[i][j1]==flag)
  109.    {
  110.     k++;
  111.     j1--;
  112.    }
  113.    if(k>3)
  114.     return(4);
  115.   }
  116.  }
  117.  return(0);
  118. }
  119.  
  120. /*
  121.  * c : bit  valeur  signification
  122.  *
  123.  *            0        la figure est encerclée
  124.  *      0     1        la case avant est vide
  125.  *      1     2          "              "     + on peut l'atteindre de suite
  126.  *      2     4        la seconde case avant est vide
  127.  *      3     8          "                      "     + on peut l'atteindre de suite
  128.  *      4    16        la seconde case avant est occupée par un de nos pions
  129.  *
  130.  *      5    32        la case après est vide
  131.  *      6    64          "              "     + on peut l'atteindre de suite
  132.  *      7   128        la seconde case après est vide
  133.  *      8   256          "                      "     + on peut l'atteindre de suite
  134.  *      9   512        la seconde case après est occupée par un de nos pions
  135.  *
  136. */
  137.  
  138. short evalue(UBYTE k,UWORD c)
  139. {
  140.  short eval=0;
  141.  
  142.  if(k==2)
  143.  {
  144.   if(c&1)
  145.   {
  146.    if(c&32)
  147.     if((c&528)==528)        /* X.XX.X */
  148.      if((c&66)==66)
  149.       eval=(GAIN);
  150.      else
  151.       if(c&66)
  152.        eval=(TROIS);
  153.       else
  154.        eval=(BTROIS);
  155.     else
  156.      if(c&512)            /* .XX.X */
  157.       if(c&66)
  158.        eval=(TROIS);
  159.       else
  160.        eval=(BTROIS);
  161.      else
  162.       if(c&16)            /* X.XX. */
  163.        if(c&2)
  164.         eval=(TROIS);
  165.        else
  166.         eval=(BTROIS);
  167.       else
  168.        if((c&132)==132)        /* ..XX.. */
  169.         if(((c&322)==322)||((c&74)==74))
  170.          eval=(GAIN);
  171.         else
  172.          eval=(DEUXDEUX);
  173.        else
  174.         if(c&128)        /* .XX.. */
  175.          if((c&322)==322)
  176.           eval=(GAIN);
  177.          else
  178.           eval=(DEUX);
  179.         else
  180.          if(c&4)        /* ..XX. */
  181.           if((c&74)==74)
  182.            eval=(GAIN);
  183.           else
  184.            eval=(DEUX);
  185.          else            /* .XX. */
  186.           eval=(DEUX);
  187.    else
  188.     if(c&4)            /* ..XX */
  189.      if((c&10)==10)
  190.       eval=(DEUXDEUX);
  191.      else
  192.       eval=(DEUX);
  193.     else
  194.      if(c&16)            /* X.XX */
  195.       if(c&2)
  196.        eval=(TROIS);
  197.       else
  198.        eval=(BTROIS);
  199.   }
  200.   else
  201.    if((c&160)==160)        /* XX.. */
  202.     if((c&320)==320)
  203.      eval=(DEUXDEUX);
  204.     else
  205.      eval=(DEUX);
  206.    else
  207.     if(c&512)            /* XX.X */
  208.      if(c&64)
  209.       eval=(TROIS);
  210.      else
  211.       eval=(BTROIS);
  212.  }
  213.  else
  214.  {
  215.   if((c&33)==33)        /* .XXX. */
  216.    if((c&66)==66)
  217.     eval=(GAIN);
  218.    else
  219.     if(c&66)
  220.      eval=(BTROISTROIS);
  221.     else
  222.      eval=(BTROISBTROIS);
  223.   else
  224.    if(c&1)            /* .XXX */
  225.     if(c&2)
  226.      eval=(TROIS);
  227.     else
  228.      eval=(BTROIS);
  229.    else
  230.     if(c&32)            /* XXX. */
  231.      if(c&64)
  232.       eval=(TROIS);
  233.      else
  234.       eval=(BTROIS);
  235.  }
  236. #ifdef DEB
  237.  printf("k=%d c=%d val=%d\n",k,c,eval);
  238. #endif
  239.  return(eval);
  240. }
  241.  
  242. short evalue2(UBYTE k,UWORD c)
  243. {
  244.  short eval=0;
  245.  
  246.  if(k==2)
  247.  {
  248.   if(c&1)
  249.   {
  250.    if(c&32)
  251.     if((c&528)==528)        /* X.XX.X */
  252.      if((c&66)==66)
  253.       eval=(GAIN);
  254.      else
  255.       if(c&66)
  256.        eval=(BTROIS);
  257.       else
  258.        eval=(TROIS);
  259.     else
  260.      if(c&512)            /* .XX.X */
  261.       if(c&66)
  262.        eval=(BTROIS);
  263.       else
  264.        eval=(TROIS);
  265.      else
  266.       if(c&16)            /* X.XX. */
  267.        if(c&2)
  268.         eval=(BTROIS);
  269.        else
  270.         eval=(TROIS);
  271.       else
  272.        if((c&132)==132)        /* ..XX.. */
  273.         if(((c&322)==322)||((c&74)==74))
  274.          eval=(RGAIN);
  275.         else
  276.          eval=(DEUXDEUX);
  277.        else
  278.         if(c&128)        /* .XX.. */
  279.          if((c&322)==322)
  280.           eval=(RGAIN);
  281.          else
  282.           eval=(DEUX);
  283.         else
  284.          if(c&4)        /* ..XX. */
  285.           if((c&74)==74)
  286.            eval=(RGAIN);
  287.           else
  288.            eval=(DEUX);
  289.          else            /* .XX. */
  290.           eval=(DEUX);
  291.    else
  292.     if(c&4)            /* ..XX */
  293.      if((c&10)==10)
  294.       eval=(DEUXDEUX);
  295.      else
  296.       eval=(DEUX);
  297.     else
  298.      if(c&16)            /* X.XX */
  299.       if(c&2)
  300.        eval=(BTROIS);
  301.       else
  302.        eval=(TROIS);
  303.   }
  304.   else
  305.    if((c&160)==160)        /* XX.. */
  306.     if((c&320)==320)
  307.      eval=(DEUXDEUX);
  308.     else
  309.      eval=(DEUX);
  310.    else
  311.     if(c&512)            /* XX.X */
  312.      if(c&64)
  313.       eval=(BTROIS);
  314.      else
  315.       eval=(TROIS);
  316.  }
  317.  else
  318.  {
  319.   if((c&33)==33)        /* .XXX. */
  320.    if((c&66)==66)
  321.     eval=(GAIN);
  322.    else
  323.     if(c&66)
  324.      eval=(BTROISTROIS);
  325.     else
  326.      eval=(TROISTROIS);
  327.   else
  328.    if(c&1)            /* .XXX */
  329.     if(c&2)
  330.      eval=(BTROIS);
  331.     else
  332.      eval=(TROIS);
  333.    else
  334.     if(c&32)            /* XXX. */
  335.      if(c&64)
  336.       eval=(BTROIS);
  337.      else
  338.       eval=(TROIS);
  339.  }
  340. #ifdef DEB
  341.  printf("k=%d c=%d val=%d\n",k,c,eval);
  342. #endif
  343.  return(eval);
  344. }
  345.  
  346. short EvalTab(ptrtab pipo)
  347. {
  348.  ULONG i,j,k,i1,j1;
  349.  ULONG c;
  350.  short eval=0;
  351.  
  352.  for(j=GAGNE;j!=pipo->colonnes[XMAX+GAGNE-1];)
  353.  {
  354.   k=1;
  355.   if(pipo->jeu[XMAX+GAGNE-1][j]==ORDINATEUR)
  356.   {
  357.    j++;
  358.    while(pipo->jeu[XMAX+GAGNE-1][j]==ORDINATEUR)
  359.    {
  360.     k++;
  361.     j++;
  362.    }
  363.    if(k>=GAGNE)
  364.     return(QUATRE);
  365.    if(pipo->jeu[XMAX+GAGNE-1][j]==RIEN)
  366.     if(k==2)
  367.      eval+=DEUX;
  368.     else
  369.      if(k==3)
  370.       eval+=TROIS;
  371.   }
  372.   else
  373.   {
  374.    j++;
  375.    while(pipo->jeu[XMAX+GAGNE-1][j]==JOUEUR)
  376.    {
  377.     k++;
  378.     j++;
  379.    }
  380.    if(k>=GAGNE)
  381.     return(-QUATRE);
  382.    if(pipo->jeu[XMAX+GAGNE-1][j]==RIEN)
  383.     if(k==2)
  384.      eval-=DEUX;
  385.     else
  386.      if(k==3)
  387.       eval-=TROIS;
  388.   }
  389.  }
  390.  for(i=GAGNE;i!=XMAX+GAGNE-1;i++)
  391.   for(j=GAGNE;j!=pipo->colonnes[i];j++)
  392.    if(pipo->jeu[i][j]==ORDINATEUR)
  393.    {
  394.     eval+=lignes[i-GAGNE];
  395.     if(pipo->jeu[i-1][j-1]!=ORDINATEUR)
  396.     {
  397.      k=1;
  398.      i1=i+1;
  399.      j1=j+1;
  400.      while(pipo->jeu[i1][j1]==ORDINATEUR)
  401.      {
  402.       k++;
  403.       j1++;
  404.       i1++;
  405.      }
  406.      if(k>=GAGNE)
  407.       return(QUATRE);
  408.      else
  409.       if(k>1)
  410.       {
  411. #ifdef DEB
  412.  printf("*Dh %d %d ",i-GAGNE+1,j-GAGNE+1);
  413. #endif
  414.        c=0;
  415.        if(pipo->jeu[i-1][j-1]==RIEN)
  416.        {
  417.         if(pipo->colonnes[i-1]==j-1)
  418.          c=3;
  419.         else
  420.          c=1;
  421.         if(pipo->jeu[i-2][j-2]==RIEN)
  422.          if(pipo->colonnes[i-2]==j-2)
  423.           c|=12;
  424.          else
  425.           c|=4;
  426.         else
  427.          if(pipo->jeu[i-2][j-2]==ORDINATEUR)
  428.           c|=16;
  429.        }
  430.        if(pipo->jeu[i1][j1]==RIEN)
  431.        {
  432.         if(pipo->colonnes[i1]==j1)
  433.          c|=96;
  434.         else
  435.          c|=32;
  436.         if(pipo->jeu[i1+1][j1+1]==RIEN)
  437.          if(pipo->colonnes[i1+1]==j1+1)
  438.           c|=384;
  439.          else
  440.           c|=128;
  441.         else
  442.          if(pipo->jeu[i1+1][j1+1]==ORDINATEUR)
  443.           c|=512;
  444.        }
  445.        if(c&99)
  446.         eval+=evalue(k,c);
  447.       }
  448.     }
  449.     if(pipo->jeu[i-1][j+1]!=ORDINATEUR)
  450.     {
  451.      k=1;
  452.      i1=i+1;
  453.      j1=j-1;
  454.      while(pipo->jeu[i1][j1]==ORDINATEUR)
  455.      {
  456.       k++;
  457.       j1--;
  458.       i1++;
  459.      }
  460.      if(k>=GAGNE)
  461.       return(QUATRE);
  462.      else
  463.       if(k>1)
  464.       {
  465. #ifdef DEB
  466.  printf("*Db %d %d ",i-GAGNE+1,j-GAGNE+1);
  467. #endif
  468.        c=0;
  469.        if(pipo->jeu[i-1][j+1]==RIEN)
  470.        {
  471.         if(pipo->colonnes[i-1]==j+1)
  472.          c=3;
  473.         else
  474.          c=1;
  475.         if(pipo->jeu[i-2][j+2]==RIEN)
  476.          if(pipo->colonnes[i-2]==j+2)
  477.           c|=12;
  478.          else
  479.           c|=4;
  480.         else
  481.          if(pipo->jeu[i-2][j+2]==ORDINATEUR)
  482.           c|=16;
  483.        }
  484.        if(pipo->jeu[i1][j1]==RIEN)
  485.        {
  486.         if(pipo->colonnes[i1]==j1)
  487.          c|=96;
  488.         else
  489.          c|=32;
  490.         if(pipo->jeu[i1+1][j1-1]==RIEN)
  491.          if(pipo->colonnes[i1+1]==j1-1)
  492.           c|=384;
  493.          else
  494.           c|=128;
  495.         else
  496.          if(pipo->jeu[i1+1][j1-1]==ORDINATEUR)
  497.           c|=512;
  498.        }
  499.        if(c&99)
  500.         if(k==3)
  501.          eval+=evalue(k,c);
  502.       }
  503.     }
  504.     if(pipo->jeu[i-1][j]!=ORDINATEUR)
  505.     {
  506.      k=1;
  507.      i1=i+1;
  508.      while(pipo->jeu[i1][j]==ORDINATEUR)
  509.      {
  510.       k++;
  511.       i1++;
  512.      }
  513.      if(k>=GAGNE)
  514.       return(QUATRE);
  515.      else
  516.       if(k>1)
  517.       {
  518. #ifdef DEB
  519.  printf("*Hz %d %d ",i-GAGNE+1,j-GAGNE+1);
  520. #endif
  521.        c=0;
  522.        if(pipo->jeu[i-1][j]==RIEN)
  523.        {
  524.         if(pipo->colonnes[i-1]==j)
  525.          c=3;
  526.         else
  527.          c=1;
  528.         if(pipo->jeu[i-2][j]==RIEN)
  529.          if(pipo->colonnes[i-2]==j)
  530.           c|=12;
  531.          else
  532.           c|=4;
  533.         else
  534.          if(pipo->jeu[i-2][j]==ORDINATEUR)
  535.           c|=16;
  536.        }
  537.        if(pipo->jeu[i1][j]==RIEN)
  538.        {
  539.         if(pipo->colonnes[i1]==j)
  540.          c|=96;
  541.         else
  542.          c|=32;
  543.         if(pipo->jeu[i1+1][j]==RIEN)
  544.          if(pipo->colonnes[i1+1]==j)
  545.           c|=384;
  546.          else
  547.           c|=128;
  548.         else
  549.          if(pipo->jeu[i1+1][j]==ORDINATEUR)
  550.           c|=512;
  551.        }
  552.        if(c&99)
  553.         eval+=evalue(k,c);
  554.       }
  555.     }
  556.     k=1;
  557.     j1=j+1;
  558.     while(pipo->jeu[i][j1]==ORDINATEUR)
  559.     {
  560.      k++;
  561.      j1++;
  562.     }
  563.     if(k>=GAGNE)
  564.      return(QUATRE);
  565.     else
  566.      if(pipo->jeu[i][j1]==RIEN)
  567.       if(k==2)
  568.        eval+=DEUX;
  569.       else
  570.        if(k==3)
  571.        eval+=TROIS;
  572.    }
  573.    else
  574.    {
  575.     eval-=lignes[i-GAGNE];
  576.     if(pipo->jeu[i-1][j-1]!=JOUEUR)
  577.     {
  578.      k=1;
  579.      i1=i+1;
  580.      j1=j+1;
  581.      while(pipo->jeu[i1][j1]==JOUEUR)
  582.      {
  583.       k++;
  584.       j1++;
  585.       i1++;
  586.      }
  587.      if(k>1)
  588.      {
  589. #ifdef DEB
  590.  printf("Dh %d %d ",i-GAGNE+1,j-GAGNE+1);
  591. #endif
  592.       if(k>=GAGNE)
  593.        return(-QUATRE);
  594.       c=0;
  595.       if(pipo->jeu[i-1][j-1]==RIEN)
  596.       {
  597.        if(pipo->colonnes[i-1]==j-1)
  598.         c=3;
  599.        else
  600.         c=1;
  601.        if(pipo->jeu[i-2][j-2]==RIEN)
  602.         if(pipo->colonnes[i-2]==j-2)
  603.          c|=12;
  604.         else
  605.          c|=4;
  606.        else
  607.         if(pipo->jeu[i-2][j-2]==JOUEUR)
  608.          c|=16;
  609.       }
  610.       if(pipo->jeu[i1][j1]==RIEN)
  611.       {
  612.        if(pipo->colonnes[i1]==j1)
  613.         c|=96;
  614.        else
  615.         c|=32;
  616.        if(pipo->jeu[i1+1][j1+1]==RIEN)
  617.         if(pipo->colonnes[i1+1]==j1+1)
  618.          c|=384;
  619.         else
  620.          c|=128;
  621.        else
  622.         if(pipo->jeu[i1+1][j1+1]==JOUEUR)
  623.          c|=512;
  624.       }
  625.       if(c&99)
  626.        eval-=evalue2(k,c);
  627.      }
  628.     }
  629.     if(pipo->jeu[i-1][j+1]!=JOUEUR)
  630.     {
  631.      k=1;
  632.      i1=i+1;
  633.      j1=j-1;
  634.      while(pipo->jeu[i1][j1]==JOUEUR)
  635.      {
  636.       k++;
  637.       j1--;
  638.       i1++;
  639.      }
  640.      if(k>1)
  641.      {
  642. #ifdef DEB
  643.  printf("Db %d %d ",i-GAGNE+1,j-GAGNE+1);
  644. #endif
  645.       if(k>=GAGNE)
  646.        return(-QUATRE);
  647.       c=0;
  648.       if(pipo->jeu[i-1][j+1]==RIEN)
  649.       {
  650.        if(pipo->colonnes[i-1]==j+1)
  651.         c=3;
  652.        else
  653.         c=1;
  654.        if(pipo->jeu[i-2][j+2]==RIEN)
  655.         if(pipo->colonnes[i-2]==j+2)
  656.          c|=12;
  657.         else
  658.          c|=4;
  659.        else
  660.         if(pipo->jeu[i-2][j+2]==JOUEUR)
  661.          c|=16;
  662.       }
  663.       if(pipo->jeu[i1][j1]==RIEN)
  664.       {
  665.        if(pipo->colonnes[i1]==j1)
  666.         c|=96;
  667.        else
  668.         c|=32;
  669.        if(pipo->jeu[i1+1][j1-1]==RIEN)
  670.         if(pipo->colonnes[i1+1]==j1-1)
  671.          c|=384;
  672.         else
  673.          c|=128;
  674.        else
  675.         if(pipo->jeu[i1+1][j1-1]==JOUEUR)
  676.          c|=512;
  677.       }
  678.       if(c&99)
  679.        eval-=evalue2(k,c);
  680.      }
  681.     }
  682.     if(pipo->jeu[i-1][j]!=JOUEUR)
  683.     {
  684.      k=1;
  685.      i1=i+1;
  686.      while(pipo->jeu[i1][j]==JOUEUR)
  687.      {
  688.       k++;
  689.       i1++;
  690.      }
  691.      if(k>1)
  692.      {
  693. #ifdef DEB
  694.  printf("Hz %d %d ",i-GAGNE+1,j-GAGNE+1);
  695. #endif
  696.       c=0;
  697.       if(k>=GAGNE)
  698.        return(-QUATRE);
  699.       if(pipo->jeu[i-1][j]==RIEN)
  700.       {
  701.        if(pipo->colonnes[i-1]==j)
  702.         c=3;
  703.        else
  704.         c=1;
  705.        if(pipo->jeu[i-2][j]==RIEN)
  706.         if(pipo->colonnes[i-2]==j)
  707.          c|=12;
  708.         else
  709.          c|=4;
  710.        else
  711.         if(pipo->jeu[i-2][j]==JOUEUR)
  712.          c|=16;
  713.       }
  714.       if(pipo->jeu[i1][j]==RIEN)
  715.       {
  716.        if(pipo->colonnes[i1]==j)
  717.         c|=96;
  718.        else
  719.         c|=32;
  720.        if(pipo->jeu[i1+1][j]==RIEN)
  721.         if(pipo->colonnes[i1+1]==j)
  722.          c|=384;
  723.         else
  724.          c|=128;
  725.        else
  726.         if(pipo->jeu[i1+1][j]==JOUEUR)
  727.          c|=512;
  728.       }
  729.       if(c&99)
  730.        eval-=evalue2(k,c);
  731.      }
  732.     }
  733.     k=1;
  734.     j1=j+1;
  735.     while(pipo->jeu[i][j1]==JOUEUR)
  736.     {
  737.      k++;
  738.      j1++;
  739.     }
  740.     if(k>=GAGNE)
  741.      return(-QUATRE);
  742.     if(pipo->jeu[i][j1]==RIEN)
  743.      if(k==2)
  744.       eval-=DEUX;
  745.      else
  746.       if(k==3)
  747.        eval-=TROIS;
  748.    }
  749.  return(eval);
  750. }
  751.  
  752. short GenCoups(short valeur)
  753. {
  754.  UBYTE i,k,coup=PIPO;
  755.  short local,tmp;
  756.  static char prof=1,mode=-1,flag=ORDINATEUR;
  757.  
  758.  if(mode)
  759.   local=-INFINI;
  760.  else
  761.   local=INFINI;
  762.  for(i=GAGNE;i!=XMAX+GAGNE;i++)
  763.  {
  764.   if(GereEvenementsLight())
  765.    return(QUIT);
  766.   k=terrain->colonnes[i];
  767.   if(k!=YMAX+GAGNE)
  768.   {
  769.    terrain->jeu[i][k]=flag;
  770.    terrain->colonnes[i]++;
  771. #ifdef DEB
  772.  printf("Profondeur %d Coup %d ",prof,i-GAGNE+1);
  773. #endif
  774.    if(prof!=prof_max)
  775.     if(TestTab(terrain,flag))
  776.      if(mode)
  777.       tmp=VICTOIRE-prof;
  778.      else
  779.       tmp=prof-VICTOIRE;
  780.     else
  781.     {
  782.      prof++;
  783.      mode=~mode;
  784.      flag=~flag;
  785.      tmp=GenCoups(local);
  786.      flag=~flag;
  787.      mode=~mode;
  788.      prof--;
  789.     }
  790.    else
  791.    {
  792.     Positions++;
  793. #ifdef DEB
  794.  AffTab(terrain);
  795. #endif
  796.     tmp=EvalTab(terrain);
  797. #ifdef DEB
  798.  printf("\n%d\n",tmp);
  799. #endif
  800.     if(mode)
  801.     {
  802.      if(tmp==QUATRE)
  803.       tmp=VICTOIRE-prof;
  804.     }
  805.     else
  806.      if(tmp==-QUATRE)
  807.       tmp=prof-VICTOIRE;
  808.    }
  809.    terrain->jeu[i][--terrain->colonnes[i]]=RIEN;
  810.    if(tmp==QUIT)
  811.     return(QUIT);
  812.  
  813.    if(mode)
  814.    {
  815.     if(tmp>valeur)
  816.      if(valeur!=-INFINI)
  817.       return(tmp);
  818.     if(tmp>=local)
  819.     {
  820.      local=tmp;
  821.      coup=i;
  822.     }
  823.    }
  824.    else
  825.    {
  826.     if(tmp<valeur)
  827.      if(valeur!=-INFINI)
  828.       return(tmp);
  829.     if(tmp<=local)
  830.     {
  831.      local=tmp;
  832.      coup=i;
  833.     }
  834.    }
  835.   }
  836.  }
  837.  CoupX[prof]=coup;
  838.  if(coup==PIPO)
  839.  {
  840.   Positions++;
  841.   if(mode)
  842.   {
  843.    if(valeur<0)
  844.     if(valeur!=-INFINI)
  845.      return(0);
  846.    if(local<=0)
  847.     local=0;
  848.   }
  849.   else
  850.   {
  851.    if(valeur>0)
  852.     if(valeur!=INFINI)
  853.      return(0);
  854.    if(local>=0)
  855.     local=0;
  856.   }
  857.  }
  858.  return(local);
  859. }
  860.